/**
 * 31. 下一个排列
 * 实现获取 下一个排列 的函数，算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
 *
 * 如果不存在下一个更大的排列，则将数字重新排列成最小的排列（即升序排列）。
 *
 * 必须 原地 修改，只允许使用额外常数空间。
 *
 *
 * 示例 1：
 * 输入：nums = [1,2,3]
 * 输出：[1,3,2]
 *
 * 示例 2：
 * 输入：nums = [3,2,1]
 * 输出：[1,2,3]
 *
 * 示例 3：
 * 输入：nums = [1,1,5]
 * 输出：[1,5,1]
 *
 * 示例 4：
 * 输入：nums = [1]
 * 输出：[1]
 *
 * 提示：
 * 1 <= nums.length <= 100
 * 0 <= nums[i] <= 100
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/next-permutation
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

package zw;

class T31 {
    public static void nextPermutation(int[] nums) {
        if(nums.length == 1){
            return;
        }
        int i = nums.length-2;
        while(i > 0 && nums[i] >= nums[i+1]){
            i--;
        }
        if(i==0 && nums[0] > nums[1]){
            for(int p = 0; p < nums.length/2; p++){
                int a = nums[nums.length - 1 - p];
                nums[nums.length - 1 - p] = nums[p];
                nums[p] = a;
            }
        } else {
            int temp = 101;
            int index = -1;
            for(int j = i+1; j < nums.length; j++) {
                if(nums[j] > nums[i] && nums[j] < temp) {
                    temp = nums[j];
                    index = j;
                }
            }
            if(index == -1){
                return;
            }
            int a = nums[index];
            nums[index] = nums[i];
            nums[i] = a;

            for(int k = nums.length; k > i; k--){
                for(int b = i+1; b + 1 < k; b++) {
                    if(nums[b] > nums[b+1]) {
                        int c = nums[b];
                        nums[b] = nums[b+1];
                        nums[b+1] = c;
                    }
                }
            }
        }
    }
}
